﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.ComponentModel;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Articulos;
using CalculoPreciosUnitarios.Logica.GestorObject.Articulo;
using System.Threading;
using System.Globalization;
using Microsoft.VisualBasic;
using CalculoPreciosUnitarios.Ventanas.Listados;


namespace CalculoPreciosUnitarios.Ventanas.Articulo
{
    /// <summary>
    /// Lógica de interacción para FArticulo.xaml
    /// </summary>
    /// 
    public partial class FArticulo : Window
    {
        private IFormatProvider localConfig = new System.Globalization.CultureInfo("es-AR");
        private List<ArticuloCS> _Larticulos = new List<ArticuloCS>();
        private ArticuloCS _articulo = new ArticuloCS();
        private ArticuloCS _articuloAux = new ArticuloCS();
        private articulosDB _articuloDB = new articulosDB();
        private string message = "";
        private string caption = "";
		private MessageBoxButton buttons ;      

        #region constructor
        public FArticulo()
        {
            InitializeComponent();
            //
            // manejador de atajos por teclados !!!
            //
            AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)HandleKeyDownEvent);
            this.DataContext = _articulo;
            _articulo.PropertyChanged += new PropertyChangedEventHandler(articulo_PropertyChanged); 
            _Larticulos = _articuloDB.obtenerArticulos();
            dgArticulos.ItemsSource = _Larticulos;
            dgArticulos.Items.Refresh();

            //si hay articulos habilito imprimir el listado
            if (_Larticulos.Count != 0) 
                btnImprimirListado.IsEnabled = true;
        }

        #endregion

        #region metodos

        //
        // metodo manejador de atajos
        //
        private void HandleKeyDownEvent(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Tab && (Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift))
            {
                MessageBox.Show("CTRL + SHIFT + TAB atrapado");
            }

            if (e.Key == Key.G && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
            {
                MessageBox.Show("CTRL + G atrapado");
            }

            if (e.Key == Key.P && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
            {
                imprimir_listado();
            }
        }

        //
        // solo numero con "," // "." en ascci = 46
        //
        private void txtPrecio_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void articulo_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            //MessageBox.Show(_articulo.IsValid().ToString());
            btnAceptar.IsEnabled = (_articulo.IsValid() && ((_articuloDB.busca_Articulo_por_Codigo(_articulo)).Count == 0));
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //btnAceptar.IsEnabled = _articulo.IsValid();
            txtCodigo.Focus();
            txtCodigo.SelectionLength = txtCodigo.Text.Length;
        }

        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void dgArticulos_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if ((dgArticulos.SelectedIndex >= 0) && (_Larticulos.Count >= 0))
            {
                _articuloAux.Codigo = _Larticulos[dgArticulos.SelectedIndex].Codigo;
                _articulo.Codigo = _Larticulos[dgArticulos.SelectedIndex].Codigo;
                _articulo.Detalle = _Larticulos[dgArticulos.SelectedIndex].Detalle;
                _articulo.Precio = _Larticulos[dgArticulos.SelectedIndex].Precio;

                //_articulo = _Larticulos[dgArticulos.SelectedIndex];
                this.DataContext = _articulo;


                //selecciono el codigo 
                this.txtCodigo.SelectionStart = 0;
                this.txtCodigo.SelectionLength=10;

                //Habilito las teclas
                //btnAceptar.IsEnabled = false;
                btnModificar.IsEnabled = true;
                btnEliminar.IsEnabled = true;
                txtCodigo.Focus();

            }
        }

        private void btnModificar_Click(object sender, RoutedEventArgs e)
        {
            modificar_articulo();
        }

        private void modificar_articulo()
        {
            message = "Se va a modificar un articulo. Desea modificarlo de todas maneras?";
            caption = "Información";
            buttons = MessageBoxButton.YesNo;
            MessageBoxResult result = MessageBox.Show(message, caption, buttons);
            if (result == MessageBoxResult.Yes)
            {
                ArticuloCS _auxArt = new ArticuloCS();
                _auxArt.Codigo = txtCodigo.Text;
                _auxArt.Detalle = txtDetalle.Text;
                _auxArt.Precio = Convert.ToDecimal(txtPrecio.Text, localConfig);
                _Larticulos.Clear();
                _Larticulos = _articuloDB.actualizar_Articulo(_articulo);
                dgArticulos.ItemsSource = _Larticulos;
                //_articuloAux.Codigo = "";
            }
        }

        private void btnEliminar_Click(object sender, RoutedEventArgs e)
        {
            eliminar_articulo();
        }

        private void eliminar_articulo() 
        {
            message = "Se va a eliminar un articulo. Desea eliminarlo de todas maneras?,\nel mismo va a ser irecuperable";
            caption = "Información";
            buttons = MessageBoxButton.YesNo;
            MessageBoxResult result = MessageBox.Show(message, caption, buttons);
            if (result == MessageBoxResult.Yes)
            {
                _Larticulos.Clear();
                _Larticulos = _articuloDB.baja_Articulo(_articulo);
                dgArticulos.ItemsSource = _Larticulos;
                if (_Larticulos.Count == 0)
                {
                    btnImprimirListado.IsEnabled = false;
                }
            }
        }

        private void btnAceptar_Click(object sender, RoutedEventArgs e)
        {
            ingresar_articulo();
        }

        private void ingresar_articulo()
        {
            message = "Se va a agregar un nuevo articulo. Desea Ingresarlo?";
            caption = "Información";
            buttons = MessageBoxButton.YesNo;
            MessageBoxResult result = MessageBox.Show(message, caption, buttons);
            if (result == MessageBoxResult.Yes)
            {
                ArticuloCS _auxArt = new ArticuloCS();
                _auxArt.Codigo = txtCodigo.Text.PadLeft(4,'0');
                _auxArt.Detalle = txtDetalle.Text;

                string correctPrecio = txtPrecio.Text.Replace(".", ",");
                _auxArt.Precio = Convert.ToDecimal(correctPrecio, localConfig);
                _Larticulos.Clear();
                _Larticulos = _articuloDB.alta_Articulo(_auxArt);
                dgArticulos.ItemsSource = _Larticulos;
            }
        }

        private void txtCodigo_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;

            if (e.Key == Key.Enter)
            {
                buscarXcodigo();
                //e.Handled = true;
                //uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void txtDetalle_KeyUp(object sender, KeyEventArgs e)
        {            
            if (e.Key == Key.Enter)
            {
                buscarXdetalle();
            }            
        }

        private void txtPrecio_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;

            if (e.Key == Key.Enter)
            {
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
            else 
            {

            }
        }



        private void btnChangeKey_Click(object sender, RoutedEventArgs e)
        {
            cambiarCodigo();
        }

        void cambiarCodigo ()
        {             
            _articuloAux.Codigo =  Microsoft.VisualBasic.Interaction.InputBox("Ingrese el nuevo Codigo a sustituir", "Nuevo Codigo", _articulo.Codigo.PadLeft(4,'0'),120,100);
            _articuloAux.Detalle = txtDetalle.Text;
            _articuloAux.Precio = Convert.ToDecimal(txtPrecio.Text, localConfig);
            if ((_articuloAux.Codigo != "") && (_articuloAux.Codigo.Length <= 4))
            {
                ArticuloCS auxNuevoArticulo = new ArticuloCS();
                auxNuevoArticulo.Codigo = _articuloAux.Codigo;

                auxNuevoArticulo = _articuloDB.busca_Articulo_por_Codigo2(auxNuevoArticulo);
                if(auxNuevoArticulo.Codigo.Equals(""))
                {
                    _Larticulos.Clear();
                    _Larticulos = _articuloDB.cambiar_codigo_Articulo(_articuloAux, _articulo);
                    dgArticulos.ItemsSource = _Larticulos;
                }
                else
                {
                    MessageBox.Show("El codigo " + _articuloAux.Codigo.PadLeft(4,'0').ToUpper() + " esta siendo utilizado por la Unidad " + auxNuevoArticulo.Detalle.ToUpper());
                }
            }
        }       

        private void buscarXcodigo()        
        {
            //habilito las teclas;
            //btnAceptar.IsEnabled = false;
            //btnModificar.IsEnabled = false;
            //btnEliminar.IsEnabled = false;
            _Larticulos.Clear();
            _Larticulos = _articuloDB.busca_Articulo_por_Codigo(_articulo);
            dgArticulos.ItemsSource = _Larticulos;
            dgArticulos.Items.Refresh();
            habilitarBotones();
        }

        private void buscarXdetalle()
        {
            _articuloAux.Detalle = txtDetalle.Text;
            _Larticulos.Clear();
            _Larticulos = _articuloDB.busca_Articulo_por_detalle(_articulo);
            dgArticulos.ItemsSource = _Larticulos;
            dgArticulos.Items.Refresh();
            habilitarBotones();
        }

        private void habilitarBotones() 
        {
            if (_Larticulos.Count != 0)
            {
                //muestro el primer registro en los textbox
                _articulo.Codigo = _Larticulos[0].Codigo;
                _articulo.Detalle = _Larticulos[0].Detalle;
                _articulo.Precio = _Larticulos[0].Precio;
                //habilito las teclas;
                //btnAceptar.IsEnabled = false;
                btnModificar.IsEnabled = true;
                btnEliminar.IsEnabled = true;
                btnImprimirListado.IsEnabled = true;
            }
            else
            {
                //txtCodigo.Text = "";
                txtDetalle.Text = "";
                txtPrecio.Text = "0";
                //habilito las teclas;
                //if (!string.IsNullOrEmpty(txtCodigo.Text))
                    //btnAceptar.IsEnabled = true;
                btnModificar.IsEnabled = false;
                btnEliminar.IsEnabled = false;
                btnImprimirListado.IsEnabled = false;
            }
        }

        private void btnImprimirListado_Click(object sender, RoutedEventArgs e)
        {
            imprimir_listado();
        }

        private void imprimir_listado()
        {
            this.btnImprimirListado.Focus();
            string miRdlc = "CalculoPreciosUnitarios.Ventanas.Listados.Listado_Articulo.RptInformeArticulo.rdlc";
            string miNameDataSet = "DataSetArticulo";
            FReporte rp = new FReporte(_Larticulos, miRdlc, miNameDataSet, 1);
            rp.Show();
        }

        private void txtCodigo_GotFocus(object sender, RoutedEventArgs e)
        {            
            txtCodigo.SelectionLength = txtCodigo.Text.Length;
        }

        private void txtDetalle_GotFocus(object sender, RoutedEventArgs e)
        {            
            txtDetalle.SelectionLength = txtDetalle.Text.Length;
        }

        private void txtPrecio_GotFocus(object sender, RoutedEventArgs e)
        {
            txtPrecio.SelectionLength = txtPrecio.Text.Length;
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "F3":
                    ingresar_articulo();
                    break;
                case "F4":
                    modificar_articulo();
                    break;
                case "F5":
                    eliminar_articulo();
                    break;
                case "F6":
                    cambiarCodigo();
                    break;
                case "F7":
                    imprimir_listado();
                    break;
                case "ESCAPE":
                    this.Close();
                    break;
                default:
                    return;
            }
        }

        #endregion

       
    }
}

